package com.admin.client.rpc;

import java.util.List;

import com.admin.client.AppConstants;
import com.admin.client.components.MenuDialog;
import com.admin.client.components.MenuLateral;
import com.admin.client.components.MenuPanel;
import com.admin.client.locale.AdminConstants;
import com.admin.share.model.MensajeData;
import com.admin.share.model.MenuDTO;
import com.admin.share.services.MenuServiceAsync;
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.data.TreeLoader;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class Menus {
	
	private static MenuServiceAsync ms = Registry.get(AppConstants.MENU_SERVICE);
	public static TreeLoader<MenuDTO> loader;
	public static TreeStore<MenuDTO> store;
	private static String menu_id;
	public static MenuDialog menuDialog;
	public static MenuPanel menuPanel;	
	
	public static String usuario_id;
	public static Integer tipo;
	public static boolean carga;
	
	public static MenuLateral menuLateral;
	public static TreeStore<MenuDTO> storeLateral;

	
	private static AdminConstants constants = Registry.get(AppConstants.CONSTANTS);	
		
	
	public static void save(MenuDTO mnu) {
		menu_id = mnu.getId();
		
		if(mnu.getParametro() == null)
			mnu.setParametro("");
		
		ms.save(mnu, new AsyncCallback<MensajeData>() {

			@Override
			public void onFailure(Throwable caught) {				
				MessageBox.alert(constants.administradorConsultoriaSTI(), constants.errorConexion(), null);	
				store.rejectChanges();
			}

			@Override
			public void onSuccess(MensajeData data) {
				if (data.guardado) {					
					menuDialog.hide();
					if(menu_id != null){
						store.commitChanges();
					}else{						 
						//loader.load();
						getMenusArray();
					}
					
				}
				 else {
					 menuDialog.status.hide();
					 menuDialog.getButtonBar().enable();
					 String msg;					
					 if(data.errorTipo == 1)
						 msg = constants.menuYaExiste();
					 else if(data.errorTipo == 2)
						 msg = constants.menuYaExisteParametro();
					 else if(data.errorTipo == 3)
						 msg = constants.menuYaExisteParametroOperacionNivel();
					 else
						 msg = constants.menuNoGuardado();
					 MessageBox.alert(constants.administradorConsultoriaSTI(), msg, null);
				}						
			}
			
		});
	}
	
	public static void delete(String id) {
		  
		  ms.delete(id, new AsyncCallback<MensajeData>() {

				@Override
				public void onFailure(Throwable caught) {					
					MessageBox.alert(constants.administradorConsultoriaSTI(), constants.errorConexion(), null);					
				}

				@Override
				public void onSuccess(MensajeData data) {
					if (data.guardado) {												
						//loader.load();
						getMenusArray();
					}
					 else {						 					 
						 MessageBox.alert(constants.administradorConsultoriaSTI(), constants.menuNoEliminado(), null);
					}						
				}
				
			});
	}
	
	public static void getMenusArray(){
		menuPanel.vp.mask(constants.cargando());
		
		ms.getMenusArray(usuario_id, tipo, new AsyncCallback<List<MenuDTO>>() {

			@Override
			public void onFailure(Throwable caught) {					
				MessageBox.alert(constants.administradorConsultoriaSTI(), constants.errorConexion(), null);
				menuPanel.vp.unmask();
				menuPanel.guardarPermiso.setEnabled(true);
			}

			@Override
			public void onSuccess(List<MenuDTO> mnu) {
				store.removeAll();
				store.add(mnu, true);
				if(menuPanel.tree.isCheckable()){	    			 
	    			menuPanel.guardarPermiso.setEnabled(true);
	    			menuPanel.fireBehavior = false;
	    			menuPanel.checkPermitidos();
	    			//menuPanel.tree.expandAll();
	    			menuPanel.guardarPermiso.setEnabled(true);
	    		 }
				menuPanel.vp.unmask();				
			}
			
		});
	}
	
	public static void savePermisos(List<String> updateToPermited, List<String> insertToPermited, List<String> updateIfExistElseInsertToNoPermited){
		menuPanel.vp.mask(constants.cargando());
		ms.savePermisos(usuario_id, tipo, updateToPermited, insertToPermited, updateIfExistElseInsertToNoPermited, new AsyncCallback<MensajeData>() {

			@Override
			public void onFailure(Throwable caught) {					
				MessageBox.alert(constants.administradorConsultoriaSTI(), constants.errorConexion(), null);
				menuPanel.vp.unmask();
				menuPanel.guardarPermiso.setEnabled(true);
			}

			@Override
			public void onSuccess(MensajeData data) {
				if (data.guardado) {											
					//System.out.println("permiso guardado");
					getMenusArray();
				}
				 else {						 					 
					 MessageBox.alert(constants.administradorConsultoriaSTI(), constants.menuPermisoNoGuardado(), null);
				}
			}
			
		});
	}
	
	public static void getMenusPermitidos(String usuario_logueado_id){
		menuLateral.mask(constants.cargando());
		
		ms.getMenusPermitidos(usuario_logueado_id, new AsyncCallback<List<MenuDTO>>() {

			@Override
			public void onFailure(Throwable caught) {					
				MessageBox.alert(constants.administradorConsultoriaSTI(), constants.errorConexion(), null);
				menuLateral.unmask();
			}

			@Override
			public void onSuccess(List<MenuDTO> mnu) {
				storeLateral.removeAll();
				storeLateral.add(mnu, true);				
				menuLateral.unmask();				
			}
			
		});
	}
}
